package com.boom.web.webSocket;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 前（首页）后端交互的类实现消息的接收推送
 * @author yzw
 * @date 2021-06-10
 */
@ServerEndpoint(value = "/webSocket/index")
@Component
public class IndexSocket {

	private static final Logger log = LoggerFactory.getLogger(IndexSocket.class);

	/**
	 * 记录当前在线连接数
	 */
	private static final AtomicInteger ONLINE_COUNT = new AtomicInteger(0);

	/**
	 * 连接建立成功调用的方法
	 */
	@OnOpen
	public void onOpen(Session session) {
		// 在线数加1
		ONLINE_COUNT.incrementAndGet();
		log.info("有新连接id加入：{}，当前在线人数为：{}", session.getId(), ONLINE_COUNT.get());
	}

	/**
	 * 连接关闭调用的方法
	 */
	@OnClose
	public void onClose(Session session) {
		// 在线数减1
		ONLINE_COUNT.decrementAndGet();
		log.info("有一连接id关闭：{}，当前在线人数为：{}", session.getId(), ONLINE_COUNT.get());
	}

	/**
	 * 收到客户端消息后调用的方法
	 *
	 * @param message 客户端发送过来的消息
	 */
	@OnMessage
	public void onMessage(String message, Session session) {
		log.info("服务端收到客户端[{}]的消息:{}", session.getId(), message);
		this.sendMessage(message, session);
	}

	@OnError
	public void onError(Session session, Throwable error) {
		log.error("发生错误:{}", error.getMessage());
	}

	/**
	 * 服务端发送消息给客户端
	 */
	public void sendMessage(String message, Session toSession) {
		try {
			log.info("服务端给客户端[{}]发送消息{}", toSession.getId(), message);
			toSession.getBasicRemote().sendText(message);
		} catch (Exception e) {
			log.error("服务端发送消息给客户端失败：{}", e.getMessage());
		}
	}
}
